package com.gexiaobao.pigeon.app.util

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import androidx.core.content.FileProvider
import com.gexiaobao.pigeon.R
import com.gexiaobao.pigeon.app.ext.Constant
import com.gexiaobao.pigeon.app.util.RxToast.showToast
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX
import com.tencent.mm.opensdk.modelmsg.WXImageObject
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage
import com.tencent.mm.opensdk.modelmsg.WXVideoObject
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import java.io.ByteArrayOutputStream
import java.io.File


object WxShareUtils {

    /**
     * 分享视频类型至微信
     *
     * @param context    上下文
     * @param videoUrl   视频地址
     * @param title      视频title
     * @param mDesc      视频描述
     * @param thumbBmp   封面位图
     */
    fun shareVideo(context: Context?, videoUrl: String?, title: String?, mDesc: String?, thumbBmp: Bitmap?) {
        // 通过appId得到IWXAPI这个对象
        val wxapi = WXAPIFactory.createWXAPI(context, Constant.WX_APP_ID)
        // 检查手机或者模拟器是否安装了微信
        if (!wxapi.isWXAppInstalled) {
            showToast(context?.getString(R.string.not_installed_wechat))
            return
        }
        //初始化一个WXVideoObject，填写url
        val video = WXVideoObject()
        video.videoUrl = videoUrl
        //用 WXVideoObject 对象初始化一个 WXMediaMessage 对象
        val msg = WXMediaMessage(video)
        msg.title = title
        msg.description = mDesc
        msg.thumbData = Util.bmpToByteArray(thumbBmp, true)
        //构造一个Req
        val req = SendMessageToWX.Req()
        req.transaction = buildTransaction("video")
        req.message = msg
        req.scene = SendMessageToWX.Req.WXSceneSession
        //调用api接口，发送数据到微信
        wxapi.sendReq(req)
    }

    /**
     * 分享本地视频类型至微信
     *
     * @param context    上下文
     * @param videoUrl   视频地址
     * @param title      视频title
     * @param mDesc      视频描述
     * @param thumbBmp   封面位图
     */
    fun shareVideoLocal(context: Context, videoFile: File?, title: String?, mDesc: String?, thumbBmp: Bitmap?) {
        val wxApi = WXAPIFactory.createWXAPI(context, Constant.WX_APP_ID)
        if (!videoFile!!.exists()) {
            return  // 如果视频文件不存在，直接返回
        }
        val videoUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // 对于 Android 7.0 及以上版本，使用 FileProvider
            FileProvider.getUriForFile(context, context.packageName + ".provider", videoFile)
        } else {
            // 对于低版本 Android，可以直接使用 Uri.fromFile
            Uri.fromFile(videoFile)
        }

        val videoObject = WXVideoObject()
        videoObject.videoUrl = videoUri.toString() // 视频的 Uri 地址

        val mediaMessage = WXMediaMessage()
        mediaMessage.mediaObject = videoObject
        mediaMessage.title = mDesc // 视频标题
        mediaMessage.description = title // 视频描述
        mediaMessage.thumbData = Util.bmpToByteArray(thumbBmp, true)

        // 分享到微信
        val req = SendMessageToWX.Req()
        req.transaction = System.currentTimeMillis().toString() // 交易唯一标识
        req.message = mediaMessage
        req.scene = SendMessageToWX.Req.WXSceneSession // 分享到聊天（会话）中

        // 调用微信 API 进行分享
        wxApi.sendReq(req)
    }

    /**
     * 分享网页类型至微信
     *
     * @param context 上下文
     * @param appId   微信的appId
     * @param webUrl  网页的url
     * @param title   网页标题
     * @param content 网页描述
     * @param bitmap  位图
     */
    fun shareWeb(context: Context?, appId: String?, webUrl: String?, title: String?, content: String?, bitmap: Bitmap?) {
        // 通过appId得到IWXAPI这个对象
        val wxapi = WXAPIFactory.createWXAPI(context, appId)
        // 检查手机或者模拟器是否安装了微信
        if (!wxapi.isWXAppInstalled) {
            showToast(context?.getString(R.string.not_installed_wechat))
            return
        }
        // 初始化一个WXWebpageObject对象
        val webpageObject = WXWebpageObject()
        // 填写网页的url
        webpageObject.webpageUrl = webUrl
        // 用WXWebpageObject对象初始化一个WXMediaMessage对象
        val msg = WXMediaMessage(webpageObject)
        // 填写网页标题、描述、位图
        msg.title = title
        msg.description = content
        // 如果没有位图，可以传null，会显示默认的图片
        msg.setThumbImage(bitmap)
        // 构造一个Req
        val req = SendMessageToWX.Req()
        // transaction用于唯一标识一个请求（可自定义）
        req.transaction = "www.gexiaobao.cn"
        // 上文的WXMediaMessage对象
        req.message = msg
        // SendMessageToWX.Req.WXSceneSession是分享到好友会话
        // SendMessageToWX.Req.WXSceneTimeline是分享到朋友圈
        req.scene = SendMessageToWX.Req.WXSceneSession
        // 向微信发送请求
        wxapi.sendReq(req)
    }

    fun sharePicture(context: Context?, appId: String?, path: String?) {
        // 通过appId得到IWXAPI这个对象
        val wxapi = WXAPIFactory.createWXAPI(context, appId)
        // 检查手机或者模拟器是否安装了微信
        if (!wxapi.isWXAppInstalled) {
            showToast(context?.getString(R.string.not_installed_wechat))
            return
        }
        val bmp = BitmapFactory.decodeFile(path)
        val tmp = WXImageObject(bmp)
        val msg = WXMediaMessage()
        msg.mediaObject = tmp
        val req = SendMessageToWX.Req()
        req.transaction = buildTransaction("image") //  transaction字段用
        req.message = msg
        req.scene = SendMessageToWX.Req.WXSceneSession
        wxapi.sendReq(req)
    }

    fun shareBitmap(context: Context?, appId: String?, bmp: Bitmap) {
        val api = WXAPIFactory.createWXAPI(context, appId)
        //初始化 WXImageObject 和 WXMediaMessage 对象
        val imgObj = WXImageObject(bmp)
        val msg = WXMediaMessage()
        msg.mediaObject = imgObj
        //设置缩略图
        val thumbBmp = Bitmap.createScaledBitmap(bmp, 200, 200, true)
        bmp.recycle()
        msg.thumbData = Util.bmpToByteArray(thumbBmp, true)
        //构造一个Req
        val req = SendMessageToWX.Req()
        req.transaction = buildTransaction("image")
        req.message = msg
        req.scene = SendMessageToWX.Req.WXSceneSession
        //调用api接口，发送数据到微信
        api.sendReq(req)
    }

    /**
     * Bitmap转换成byte[]并且进行压缩,压缩到不大于maxkb
     * @param bitmap
     * @param maxkb
     * @return
     */
    private fun bmpToByteArray(bitmap: Bitmap, maxkb: Int): ByteArray? {
        val output = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, output)
        var options = 100
        while (output.toByteArray().size > maxkb && options != 10) {
            output.reset() //清空output
            bitmap.compress(
                Bitmap.CompressFormat.JPEG,
                options,
                output
            ) //这里压缩options%，把压缩后的数据存放到output中
            options -= 10
        }
        bitmap.recycle()
        return output.toByteArray()
    }

    private fun buildTransaction(shareType: String): String {
        return shareType + System.currentTimeMillis()
    }
}